/**
 * Copyright (c) iwindplus Technologies Co., Ltd.2024-2030, All rights reserved.
 */

package com.iwindplus.boot.web.manager.http;

import com.iwindplus.boot.util.OkhttpUtil;
import com.iwindplus.boot.web.manager.HttpClientHandler;
import jakarta.annotation.Resource;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.springframework.web.multipart.MultipartFile;

/**
 * OkHttpClient 工具管理器.
 *
 * @author zengdegui
 * @since 2025/02/15 21:45
 */
@Slf4j
public class OkHttpClientManager implements HttpClientHandler {

    @Resource
    private OkHttpClient httpClient;

    /**
     * get同步请求（参数拼接）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @return String
     */
    @Override
    public String httpGet(String url, Map<String, String> header, Map<String, Object> param) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.getQueryParamRequest(url, header, param));
    }

    /**
     * post同步请求（json）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param json   参数（必填）
     * @return String
     */
    @Override
    public String httpPostByJson(String url, Map<String, String> header, String json) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.postJsonRequest(url, header, json));
    }

    /**
     * post同步请求（FormBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @return String
     */
    @Override
    public String httpPostByForm(String url, Map<String, String> header, Map<String, Object> param) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.postFormBodyRequest(url, header, param));
    }

    /**
     * post同步请求（MultipartBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param files  文件集合（可选）
     * @return String
     */
    @Override
    public String httpPostByMultipart(String url, Map<String, String> header, Map<String, Object> param, List<MultipartFile> files) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.postMultipartBodyRequest(url, header, param, files));
    }

    /**
     * put同步请求（json）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param json   参数（必填）
     * @return String
     */
    @Override
    public String httpPutByJson(String url, Map<String, String> header, String json) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.putJsonRequest(url, header, json));
    }

    /**
     * put同步请求（FormBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @return String
     */
    @Override
    public String httpPutByForm(String url, Map<String, String> header, Map<String, Object> param) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.putFormBodyRequest(url, header, param));
    }

    /**
     * put同步请求（MultipartBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param files  文件集合（可选）
     * @return String
     */
    @Override
    public String httpPutByMultipart(String url, Map<String, String> header, Map<String, Object> param, List<MultipartFile> files) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.putMultipartBodyRequest(url, header, param, files));
    }

    /**
     * delete同步请求（拼接参数）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @return String
     */
    @Override
    public String httpDelete(String url, Map<String, String> header, Map<String, Object> param) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.deleteQueryParamRequest(url, header, param));
    }

    /**
     * delete同步请求（json）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param json   参数（必填）
     * @return String
     */
    @Override
    public String httpDeleteByJson(String url, Map<String, String> header, String json) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.deleteJsonRequest(url, header, json));
    }

    /**
     * delete同步请求（FormBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @return String
     */
    @Override
    public String httpDeleteByForm(String url, Map<String, String> header, Map<String, Object> param) {
        return OkhttpUtil.executeRequest(this.httpClient, OkhttpUtil.deleteFormBodyRequest(url, header, param));
    }
}
